home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: 500 MB Amiga Software / 500 MB Amiga Software - Euber 130 - Amiga Games Disc & Mag.iso / userbox / publicdomain / addipro09 / addipro / editor / addipro.p next >
Text File  |  1995-11-11  |  46KB  |  1,417 lines

  1. PROGRAM Adressenverwaltung;
  2.  
  3. {
  4.        Gemeinschaftsproduktion einer Adressenverwaltung
  5.    
  6.               geschrieben in MaxonPascal3 von
  7.   
  8.                  
  9.                  Bombersoft  &  Røgersøft                                             
  10.                
  11.   
  12.             (Björn Schotte und Michael Klein)
  13.                                                               }
  14.                      
  15.  
  16. {$opt q}
  17.  
  18. USES Intuition, ExecSupport, Graphics, Gadtools;
  19.  
  20. {$incl "dos.lib",
  21.        "diskfont.lib",
  22.        "workbench/startup.h",
  23.        "icon.lib",
  24.        "asl.lib",
  25.        {"rexxsyslib.lib",
  26.        "gadtools.lib",}
  27.        "intuition/intuition_functions.h",
  28.        "wb.lib"}
  29.  
  30. CONST
  31. {  RexxName = "ADDIPRO";}
  32.   AppName  = "AddiPro.2";
  33.   
  34.   verstag = "$VER: AddiPro V0.90 (10.11.1995)";
  35.   
  36.   { Fensterbreiten und -höhen bei Topaz80-Font }
  37.   MainWinWidth  = 458;
  38.   EditWinWidth  = 624;
  39.   EditWinHeight = 175;
  40.  
  41.   MainIDCMP = IDCMP_GADGETUP OR
  42.               IDCMP_GADGETDOWN OR
  43.               IDCMP_MOUSEBUTTONS OR
  44.               IDCMP_CLOSEWINDOW OR
  45.               IDCMP_INTUITICKS OR
  46.               IDCMP_CHANGEWINDOW OR
  47.               IDCMP_MOUSEMOVE OR
  48.               IDCMP_MENUPICK OR
  49.               IDCMP_RAWKEY;
  50.               
  51.   { ** Gadget-Nummern des Hauptwindows ** }
  52.   M_LV           =  1;
  53.   M_NEU          =  2;
  54.   M_ÄNDERN       =  3;
  55.   M_LÖSCHEN      =  4;
  56.   M_SUCHEN       =  5;
  57.   M_SORTIEREN    =  6; 
  58.   M_BLÄTTERN     =  7;
  59.   M_SERIENDRUCK  =  8;
  60.   M_FORMULARDRUCK=  9;
  61.   M_LISTENDRUCK  = 10;
  62.  
  63.  
  64.   { ** Datensatzlänge in Zeichen ** }
  65.   namelength    = 31;
  66.   vnamelength   = 21;
  67.   strasselength = 31;
  68.   ortlength     = 31;
  69.   plzlength     = 8;
  70.   tellength     = 21;
  71.   faxlength     = 21;
  72.   geblength     = 13;
  73.   EMaillength   = 30;
  74.   AnLength      = 10;
  75.   komlength     = 80;
  76.  
  77.   { -- Kennung für die Adressdatei -- }
  78.   kennung = "AddiPro-Datei";
  79.  
  80. {  { -- Default PopKey für Commodity -- }
  81.   DefHotKey = "lcommand control a";}
  82.  
  83. TYPE
  84.   String256 = STRING[256];
  85.   String200 = STRING[200];
  86.  
  87.   WaitPointerTyp = ARRAY[1..36] OF WORD;
  88.  
  89.  tname=STRING[namelength];
  90.  tvname=STRING[vnamelength];
  91.  tStrasse=STRING[strasselength];
  92.  tort=STRING[ortlength];
  93.  tplz=STRING[plzlength];
  94.  ttel=STRING[tellength];
  95.  tfax=STRING[faxlength];
  96.  tgeb=STRING[geblength];
  97.  temail=STRING[EMaillength];
  98.  tanrede=STRING[AnLength];
  99.  tkom=STRING[komlength];
  100.  
  101.  { ** Hauptdaten-Record ** }
  102.  p_person=^person;
  103.  Person=RECORD
  104.    pn       :   node;
  105.    name     :   tname;
  106.    vorname  :   tvname;
  107.    strasse  :   tstrasse;
  108.    ort      :   tort;
  109.    plz      :   tplz;
  110.    tel      :   ttel;
  111.    fax      :   tfax;
  112.    geb      :   tgeb;
  113.    email1,
  114.    email2   :   temail;
  115.    select   :   array[1..10] of boolean;
  116.    anrede   :   byte;
  117.    anrede_s :   tAnrede;
  118.    kommentar:   tkom; 
  119.  END; 
  120.  
  121. VAR
  122.   iconname                      : STRING256;STATIC; {name der icondatei}
  123.   eigenname                     : STRING256;STATIC {name des Programms}
  124.   prefsfile                     : STRING;STATIC;
  125.   MyAppIcon                     : p_AppIcon;STATIC;
  126.   iconified                     : BOOLEAN;STATIC;
  127.   Mens                          : ARRAY[1..15] OF NewMenu;STATIC;
  128.   MyMen                         : p_Menu;STATIC;
  129.   nbuf                          : tname;STATIC; { Für die STRING-Gadgets }
  130.   vbuf                          : tvname;STATIC;
  131.   sbuf                          : tstrasse;STATIC;
  132.   obuf                          : tort;STATIC;
  133.   pbuf                          : tplz;STATIC;
  134.   tbuf                          : ttel;STATIC;
  135.   fbuf                          : tfax;STATIC;
  136.   gbuf                          : tgeb;STATIC;
  137.   kombuf                        : tkom;STATIC;
  138.   em1buf,em2buf                 : tEMail;STATIC;
  139.   PList                         : p_List;STATIC;  { Unsere List }
  140.   PNode                         : p_Person;STATIC; { Unser Record (Pointer) }
  141.   a                             : STR;STATIC;
  142.   gl,gad,gl1,gad1,KlickG,
  143.   gad2,gl2,ÜberGl               : p_Gadget;STATIC;
  144.   mgad                          : ARRAY[1..15] OF p_Gadget;STATIC;
  145.   egad                          : ARRAY[1..24] OF p_Gadget;STATIC;
  146.   agad                          : ARRAY[1..2] OF p_Gadget;STATIC;
  147.   wp,wp1,wp2                    : p_Window;STATIC;
  148.   t                             : ARRAY[1..15] OF TagItem;STATIC;
  149.   ng                            : NewGadget;STATIC;
  150.   ps                            : p_Screen;STATIC;
  151.   vi                            : PTR; STATIC;
  152.   msg                           : p_IntuiMessage;STATIC;
  153.   l                             : LONG;STATIC;
  154.   done,dummy,ok                 : BOOLEAN;STATIC;
  155.   class,qual,code               : LONG;STATIC;
  156.   err                           : WORD;STATIC;
  157.   i,j,k                         : INTEGER;STATIC;
  158.   xoff, yoff                    : INTEGER;STATIC; 
  159.   tattr                         : TextAttr;STATIC;
  160.   GadNum                        : CARDINAL;STATIC;
  161.   Anzahl                        : LONGINT;STATIC;
  162.   pfad,datei                    : String200;STATIC;
  163.   f,f1                          : Text;STATIC;
  164.   erkenn                        : STRING;STATIC;
  165.   AktuellePerson,DPerson        : p_Person;STATIC;
  166.   es                            : EasyStruct;STATIC;
  167.   s                             : STRING200;STATIC;
  168.   Knoten                        : p_Node;STATIC;
  169.   SelectTexte                   : ARRAY[1..10] OF STRING[11];STATIC;
  170.   DruckerAusgabe                : STRING[80];STATIC;
  171.   port                          : p_MsgPort;STATIC;
  172.   MainReq,BlättReq              : Requester;STATIC;
  173.   WaitPointerData               : WaitPointerTyp;STATIC;
  174.   WaitPointer                   : PTR;STATIC;
  175.   OS39                          : BOOLEAN;STATIC;
  176.   psfont,myfont                 : p_TextFont;STATIC;
  177.   WBR,WBB,psh,psw,FontX,FontY,
  178.   ww,wh                         : INTEGER;STATIC;
  179.   MyTattr                       : p_TextAttr;STATIC;
  180.   AktuellGewählt                : LONG;STATIC;
  181.   AddiProid, prefsid, verid,
  182.   AppSig{,edisig}               : LONG;STATIC;
  183.   suchbuf,passwort              : STRING;STATIC;
  184.   anredebuf                     : tAnrede;STATIC;
  185.   sgad                          : ARRAY[1..20] OF p_Gadget;STATIC;
  186.   MXLabels                      : ARRAY[1..8] OF STR; STATIC;
  187.   anrede_z                      : INTEGER;STATIC;
  188.   anrede_s                      : tAnrede;STATIC;
  189.   prozentwin                    : p_Window;STATIC;
  190.   DoppelKlick                   : BOOLEAN;STATIC;
  191.   Iconsave,autoload,verschluesseln: BOOLEAN;STATIC; {für Voreinstellungen}
  192.   druckwin,                       {ob das Druckwindow offen ist?}
  193.   vonmain                       : BOOLEAN;STATIC; {Wenn man vom Mainwindow kam}
  194.   {*}signalmasc,oldsecs, oldmics              : LONG;STATIC;
  195.   pubname                       : STR;STATIC;
  196.   EditorPort,AppPort            : p_MsgPort;STATIC;
  197.   AppWin                        : p_AppWindow;STATIC;
  198.  {Fensterkoordinatenvariablen}
  199.   MainWinHeight,          { normalerweise konstant, aber wegen Listview unter OS2.04}
  200.   EditWinLeft, EditWinTop,
  201.   Suchpfadwinleft,suchpfadwintop,
  202.   selectwinleft,selectwintop,
  203.   BlätterWinLeft, BlätterWinTop,
  204.   EinstellWinLeft, EinstellWinTop,
  205.   druckwinleft, druckwintop,
  206.   suchwinleft,suchwintop,
  207.   Seriendruckwinleft,Seriendruckwintop,
  208.   Formulardruckwinleft,Formulardruckwintop,
  209.   aslf_width,aslf_height,
  210.   aslf_topedge,aslf_leftedge,
  211.   Sortierwinleft,sortierwintop,
  212.   Listendruckwinleft,Listendruckwintop:INTEGER;STATIC;
  213.   BlätterGl                     : p_Gadget;STATIC;
  214.   BlätterWp,serdruck,fordruck   : p_Window;STATIC;
  215.   serverp                       : p_MsgPort;STATIC;
  216.   editor, textanzeiger          : STRING[256];STATIC;
  217.   ff,fd,ff1,fd1,ff2,fd2         : STRING[200];STATIC;
  218.   si                            : p_stringinfo;STATIC;
  219.   druckmask                     : LONG;STATIC;
  220.   c                             : CHAR;STATIC;
  221.  
  222. {$path"AddiPro:Editor/";
  223.   incl"errors.h",
  224.       "allgemein.h",
  225.       "winclose.h",
  226.       "listen.h",
  227.       "oberfläche.h",
  228.       "druckmenü.h",
  229.       "prefs.h",
  230.       "sortieren.h",
  231.       "dateioperationen.h"}
  232.       
  233. PROCEDURE CloseLibs;
  234. { -- Schliesst die geöffneten Libraries -- }
  235. BEGIN
  236.   IF WorkbenchBase <> NIL THEN CloseLibrary(WorkbenchBase);
  237.   IF GadToolsBase <> NIL THEN CloseLibrary(GadToolsBase);
  238. {  IF RexxSysBase <> NIL THEN CloseLibrary(RexxSysBase);}
  239.   IF DiskFontBase <> NIL THEN CloseLibrary(DiskFontBase);
  240.   IF IconBase <> NIL THEN CloseLibrary(IconBase);
  241.   IF ASLBase <> NIL THEN CloseLibrary(ASLBase);
  242.   IF DOSBase <> NIL THEN CloseLibrary(DOSBase);
  243. END;
  244.  
  245. { ** CleanUp - Routine
  246.   **
  247.   ** 24.10.1995:
  248.   **
  249.   **  - Serienbrief-Fenster wird nun bei Programmende
  250.   **    geschlossen, was vorher NICHT der Fall war
  251.   **}
  252. PROCEDURE CleanUp(why:String200; rc:INTEGER);
  253. BEGIN
  254.   IF serdruck <> NIL THEN serienende;
  255.   CloseMainWin;                                     { Hauptfenster schliessen }
  256.   IF vi <> NIL THEN FreeVisualInfo(vi);             { VisualInfo freigeben    }
  257.   IF ps <> NIL THEN UnLockPubScreen(NIL,ps)         { Publicscreen freigeben  }
  258.   IF WaitPointer <> NIL THEN FreeVec(WaitPointer);  { WaitPointer freigeben   }
  259.   IF why <> "" THEN i := MeldReq(ERRTIT,why,"ok");
  260.   closett;
  261.   CloseLibs;
  262.   HALT(rc);
  263. END;
  264.  
  265. { ** Öffnet die benötigten Libraries
  266.   **
  267.   ** }
  268. PROCEDURE OpenLibs;
  269. BEGIN
  270.   ASLBase := NIL; IconBase := NIL; 
  271.   DiskfontBase := NIL; {RexxSysBase := NIL;} GadToolsBase := NIL;
  272.   WorkbenchBase := NIL;
  273.   
  274.   DOSBase := OpenLibrary("dos.library",37);
  275.   IF DOSBase = NIL THEN CleanUp(ERRNO_DOS, 20);
  276.   ASLBase := OpenLibrary("asl.library",37);
  277.   IF ASLBase = NIL THEN CleanUp(ERRNO_ASL, 20);
  278.   IconBase := OpenLibrary("icon.library",0);
  279.   IF IconBase = NIL THEN CleanUp(ERRNO_ICON,20);
  280.   DiskfontBase := OpenLibrary("diskfont.library",0);
  281.   IF DiskfontBase = NIL THEN CleanUp(ERRNO_DISKFONT,20);
  282. {  RexxSysBase := OpenLibrary("rexxsyslib.library",0);
  283.   IF RexxSysBasE = NIL THEN CleanUp(ERRNO_REXX,20);}
  284.   GadToolsBase := OpenLibrary("gadtools.library",37);
  285.   IF GadToolsBase = NIL THEN CleanUp(ERRNO_GADTOOLS,20);
  286.   WorkbenchBase := OpenLibrary("workbench.library", 37);
  287.   IF WorkbenchBase = NIL THEN CleanUp(ERRNO_WB,20);
  288. END;
  289.  
  290. { ** Überprüft, ob Kick-Version 37+ vorhanden
  291.   **
  292.   ** 24.10.1995:
  293.   **
  294.   **  - Bei Start von Workbench erscheint nun ein
  295.   **    EasyRequester, falls kein Kick 37+ vorhanden.
  296.   ** }
  297. PROCEDURE Versionsprüfung;
  298. VAR
  299.   lib : p_Library;
  300. BEGIN
  301.   lib := IntuitionBase;
  302.   IF lib^.lib_Version < 37 THEN
  303.   BEGIN
  304.     DisplayBeep(NIL);
  305.     IF FromWB THEN i := MeldReq(ERRTIT,
  306.                                 "AddiPro ist nur ab OS2.04 lauffähig!",
  307.                                 "OK")
  308.     ELSE Writeln("Nur ab OS2.04 lauffähig !!");
  309.     HALT(20);
  310.   END;
  311.   { Ist schon Kick3.0+ vorhanden ?? }
  312.   OS39 := (lib^.lib_Version >= 39);
  313. END;
  314.  
  315. PROCEDURE FreePs;
  316. { Freigeben des gelockten PublicScreens }
  317. BEGIN
  318.   IF ps <> NIL THEN UnLockPubScreen(NIL, ps);
  319.   ps := NIL;
  320. END;
  321.  
  322. PROCEDURE GetPubScr;
  323. { -- Holt sich alles vom PublicScreen (X/Y-Offsets) und die VisualInfo -- }
  324. BEGIN
  325.   ps:=NIL;
  326.   IF pubname<>"" THEN ps := LockPubScreen(pubname)
  327.                  ELSE ps := LockPubScreen(NIL);
  328.   IF ps<>NIL THEN
  329.   BEGIN
  330.     AddExitServer(FreePs);
  331.     vi:=GetVisualInfoA(ps,NIL);
  332.     { -- Die nächsten 7 Daten werden für fontsensitives Programmieren -- }
  333.     { -- gebraucht                                                    -- }
  334.     psfont := ps^.RastPort.Font;
  335.     wbr := ps^.WBorRight;
  336.     wbb := ps^.WBorBottom;
  337.     psw := ps^.Width;
  338.     psh := ps^.Height;
  339.     xoff := ps^.WBorLeft;
  340.     yoff := ps^.BarHeight;
  341.     { ------------------------------------------------------------------ }
  342.     IF vi = NIL THEN
  343.     BEGIN
  344.       i := MeldReq("AddiPro","Kann keine VisualInfo bekommen","OK");
  345.       HALT(20);
  346.     END;
  347.   END ELSE
  348.   BEGIN
  349.     i := MeldReq("AddiPro","Kann den Publicscreen nicht locken","OK");
  350.     HALT(20);
  351.   END;
  352.   tattr := TextAttr("topaz.font",8,0,0);
  353.   ComputeFont(0,0);
  354. END;
  355.  
  356. { ** Kleine Copyright-Prozedur
  357.   **
  358.   ** 24.10.1995:
  359.   **
  360.   **   - etwas am Text geändert, nicht so wichtig.
  361.   ** }
  362. PROCEDURE Über;
  363. VAR
  364.   es   : EasyStruct;
  365.   s    : STRING[300];
  366. BEGIN
  367.   s := "       *** AddiPro V0.9ß ***"+
  368.        CHR(10)+
  369.        "(c) 1995 by Björn Schotte/Michael Klein"+
  370.        CHR(10)+
  371.        CHR(10)+
  372.        "Adressen der Autoren:"+
  373.        CHR(10)+
  374.        CHR(10)+
  375.        "  Björn Schotte"+CHR(10)+
  376.        "  Am Burkardstuhl 45"+CHR(10)+
  377.        "  D-97267 Himmelstadt"+CHR(10)+
  378.        "  EMail: bjoern@bomber.mayn.de"+CHR(10)+
  379.        CHR(10)+
  380.        "- RogerSoft -"+CHR(10)+
  381.        "  Michael Klein"+CHR(10)+
  382.        "  Am Wasserturm 6"+CHR(10)+
  383.        "  D-67346 Speyer"+CHR(10)+
  384.        "  EMail: ujqc@rz.uni-karlsruhe.de";
  385.   es := EasyStruct(SizeOf(EasyStruct),0,"Über AddiPro...",^s,"ok");
  386.   i := EasyRequestArgs(wp,^es,NIL,NIL);
  387.   s:=" Mit Dank an die Betatester:"+CHR(10)+CHR(10)+
  388.      " Røgersøft & Bombersoft ;-) , PackMAN, Wurzelsepp"+CHR(10)+
  389.      " Cyberzerk D-Sign System, Manfred Tenzler, Thorsten Mahr"+CHR(10)+
  390.      " und alle, die ich vergessen habe !";
  391.   es := EasyStruct(SizeOf(EasyStruct),0,"Betatesting done by :",^s,"ok");
  392.   i := EasyRequestArgs(wp,^es,NIL,NIL);
  393. END;
  394.  
  395. FUNCTION ÖffneEditFenster : BOOLEAN;
  396. { -- Editfenster öffnen -- }
  397. VAR
  398.   t : ARRAY[1..13] OF TagItem;
  399. BEGIN
  400.   SetEditGads;
  401.   t[1] := TagItem(WA_InnerWidth,ww);
  402.   t[2] := TagItem(WA_InnerHeight,wh);
  403.   t[3] := TagItem(WA_Flags,WFLG_DRAGBAR+WFLG_DEPTHGADGET+WFLG_ACTIVATE+
  404.                            WFLG_CLOSEGADGET+WFLG_HASZOOM+WFLG_RMBTRAP);
  405.   t[4] := TagItem(WA_Idcmp,IDCMP_CLOSEWINDOW+IDCMP_GADGETUP+
  406.                            IDCMP_CHANGEWINDOW+IDCMP_RAWKEY+
  407.          IDCMP_GADGETDOWN);
  408.   t[5].ti_Tag := WA_Title;
  409.   t[5].ti_Data := "Editfenster";
  410.   t[6] := TagItem(WA_MinWidth, 100);
  411.   t[7] := TagItem(WA_MinHeight, yoff);
  412.   t[8] := TagItem(WA_Gadgets, LONG(gl1));
  413.   t[9] := TagItem(WA_Left, EditWinLeft);
  414.   t[10] := TagItem(WA_Top, EditWinTop);
  415.   t[11].ti_Tag := TAG_DONE;
  416.   IF pubname <> "" THEN
  417.   BEGIN
  418.     t[11] := TagItem(WA_PubScreenFallBack, 1);
  419.     t[12] := TagItem(WA_PubScreenName, LONG(pubname));
  420.     t[13].ti_Tag := TAG_DONE;
  421.   END;
  422.  
  423.   wp1 := OpenWindowTagList(NIL, ^t);
  424.   IF wp1 = NIL THEN
  425.   BEGIN
  426.     FreeGadgets(gl1);
  427.     DisplayBeep(NIL);
  428.     ÖffneEditFenster := FALSE;
  429.     EXIT;
  430.   END;
  431.   ÖffneEditFenster := TRUE;
  432. END;
  433.  
  434. PROCEDURE Edit(VAR p:p_Person; ändern:BOOLEAN);
  435. { -- Die eigentliche Edit-Prozedur. Parameter:               --
  436.   -- p : Beim Neuanlegen eines Datensatzes ein NIL,          --
  437.   --     ansonsten ein schon vorhandener                     --
  438.   -- ändern: Je nachdem, welchen Wert ändern hat, wird       --
  439.   --         die vorhandene Person dargestellt und geändert, --
  440.   --         ansonsten neu eingerichtet zum Schluß !!        -- }
  441. VAR
  442.   abbruch,ok : BOOLEAN;
  443.   b          : STRING[50];
  444.   x          : STR;
  445.  
  446.   PROCEDURE Changer(Nr:INTEGER);
  447.   VAR
  448.     dummy : BOOLEAN;
  449.   BEGIN
  450.     dummy := (egad[Nr+13]^.Flags AND SELECTED) = SELECTED;
  451.     t[1] := TagItem(GTCB_Checked,ORD(NOT dummy))
  452.     t[2].ti_Tag := TAG_DONE;
  453.     GT_SetGadgetAttrsA(egad[Nr+13],wp1,NIL,^t);
  454.   END;
  455.  
  456. BEGIN
  457.   nbuf := ""; vbuf := ""; sbuf := ""; pbuf := ""; obuf := ""; tbuf := "";
  458.   fbuf := ""; gbuf := ""; em1buf := ""; em2buf := "";
  459.   kombuf := "";
  460.   anredebuf := ""; anrede_z := 0;
  461.   
  462.   IF ändern THEN
  463.   BEGIN
  464.     nbuf      := p^.Name;
  465.     vbuf      := p^.Vorname;
  466.     sbuf      := p^.Strasse;
  467.     pbuf      := p^.PLZ;
  468.     obuf      := p^.Ort;
  469.     tbuf      := p^.Tel;
  470.     fbuf      := p^.Fax;
  471.     gbuf      := p^.Geb;
  472.     em1buf    := p^.EMail1;
  473.     em2buf    := p^.EMail2;
  474.     anrede_z  := p^.anrede;
  475.     anredebuf := p^.anrede_s;
  476.     kombuf    := p^.kommentar;
  477.   END;
  478.   dummy := ÖffneEditFenster;
  479.   IF dummy THEN
  480.   BEGIN
  481.     Rahmen(wp1,2,2,508,123,TRUE);
  482.     Rahmen(wp1,2,126,618,28,TRUE);
  483.     Rahmen(wp1,2,155,618,20,TRUE);
  484.     Rahmen(wp1,511,2,110,123,TRUE);
  485.     IF ändern THEN
  486.     BEGIN
  487.       FOR i := 1 TO 10 DO
  488.       BEGIN
  489.         t[1] := TagItem(GTCB_Checked,LONG(p^.select[i]));
  490.         t[2].ti_Tag := TAG_DONE;
  491.         GT_SetGadgetAttrsA(egad[i+13],wp1,NIL,^t);
  492.       END;
  493.     END;
  494.     GT_RefreshWindow(wp1,NIL);
  495.     dummy := FALSE;
  496.     abbruch := FALSE;
  497.     ok := ActivateGadget(egad[1],wp1,NIL);
  498.     REPEAT
  499.       GetMessage(wp1,class,code,qual,GadNum);
  500.       CASE class OF
  501.         IDCMP_CLOSEWINDOW : BEGIN
  502.                               dummy := TRUE;
  503.                               abbruch := TRUE;
  504.                             END;
  505.         IDCMP_RAWKEY:
  506.           CASE code OF
  507.             54     : ok := ActivateGadget(egad[1],wp1,NIL);
  508.             52     : ok := ActivateGadget(egad[2],wp1,NIL);
  509.             32     : ok := ActivateGadget(egad[3],wp1,NIL);
  510.             25     : ok := ActivateGadget(egad[4],wp1,NIL);
  511.             24     : ok := ActivateGadget(egad[5],wp1,NIL);
  512.             20     : ok := ActivateGadget(egad[6],wp1,NIL);
  513.             35     : ok := ActivateGadget(egad[7],wp1,NIL);
  514.             36     : ok := ActivateGadget(egad[8],wp1,NIL);
  515.              1     : ok := ActivateGadget(egad[9],wp1,NIL);
  516.              2     : ok := ActivateGadget(egad[10],wp1,NIL);
  517.              3..5  : BEGIN
  518.                        anrede_z := code-3;
  519.                        t[1] := TagItem(GTMX_Active, anrede_z);
  520.                        t[2].ti_Tag := TAG_DONE;
  521.                        GT_SetGadgetAttrsA(egad[24],wp1,NIL,^t);
  522.                        t[1] := TagItem(GA_Disabled, 1);
  523.                        GT_SetGadgetAttrsA(egad[25],wp1,NIL,^t);
  524.                      END;  
  525.             43     : BEGIN
  526.                        anrede_z := 3;
  527.                        t[1] := TagItem(GTMX_Active, anrede_z);
  528.                        t[2].ti_Tag := TAG_DONE;
  529.                        GT_SetGadgetAttrsA(egad[24],wp1,NIL,^t);
  530.                        t[1] := TagItem(GA_Disabled, 0);
  531.                        GT_SetGadgetAttrsA(egad[25],wp1,NIL,^t);
  532.                        ok := ActivateGadget(egad[25],wp1,NIL);
  533.                      END;   
  534.             26     : BEGIN
  535.                        ButSelecter(wp1,egad[12]);
  536.                        dummy := TRUE;
  537.                      END;
  538.             53,69  : BEGIN
  539.                        ButSelecter(wp1,egad[13]);
  540.                        dummy := TRUE;
  541.                        abbruch := TRUE;
  542.                      END;
  543.             80..89 : Changer(code - 79);
  544.           ELSE
  545.           END;
  546.         IDCMP_GADGETUP:
  547.           CASE GadNum OF
  548.             1..10 : ok := ActivateGadget(egad[GadNum+1],wp1,NIL);
  549.             12 : dummy := TRUE;
  550.             13 : BEGIN
  551.                    dummy := TRUE;
  552.                    abbruch := TRUE;
  553.                  END;
  554.             25 : anrede_s := GetString(egad[25]);    
  555.           ELSE END;
  556.     IDCMP_GADGETDOWN:
  557.       CASE GadNum OF
  558.         24 : BEGIN
  559.                anrede_z := code;
  560.                IF anrede_z < 3 THEN
  561.                BEGIN
  562.                  t[1] := TagItem(GA_Disabled, 1);
  563.                  t[2].ti_Tag := TAG_DONE;
  564.                  GT_SetGadgetAttrsA(egad[25],wp1,NIL,^t);
  565.                END ELSE
  566.                BEGIN
  567.                  t[1] := TagItem(GA_Disabled, 0);
  568.                  t[2].ti_Tag := TAG_DONE;
  569.                  GT_SetGadgetAttrsA(egad[25],wp1,NIL,^t);
  570.                  ok := ActivateGadget(egad[25],wp1,NIL);
  571.                END;
  572.              END;  
  573.       ELSE END;   
  574.       ELSE END;
  575.     UNTIL dummy;
  576.     IF abbruch = FALSE THEN
  577.     BEGIN
  578.       IF ändern THEN
  579.       BEGIN
  580.         p^.Name    := GetString(egad[1]);
  581.         p^.Vorname := GetString(egad[2]);
  582.         p^.Strasse := GetString(egad[3]);
  583.         p^.PLZ     := GetString(egad[4]);
  584.         p^.Ort     := GetString(egad[5]);
  585.         p^.Tel     := GetString(egad[6]);
  586.         p^.Fax     := GetString(egad[7]);
  587.         p^.Geb     := GetString(egad[8]);
  588.         p^.EMail1  := GetString(egad[9]);
  589.         p^.EMail2  := GetString(egad[10]);
  590.         p^.anrede  := anrede_z;
  591.         IF anrede_z = 3 THEN p^.anrede_s:= anrede_s ELSE p^.anrede_s := "";
  592.         p^.kommentar := GetString(egad[11]);
  593.         
  594.         FOR i := 1 TO 10 DO p^.select[i] := ( (egad[i+13]^.Flags AND SELECTED)=SELECTED );
  595.         s := p^.Name+", "+p^.Vorname;
  596.         x := s;
  597.         FreeVec(PTR(p^.pn.ln_Name));
  598.         p^.pn.ln_Name := PTR(AllocVec(Length(x)+1,MEMF_ANY));
  599.         CopyMem(PTR(x),PTR(p^.pn.ln_Name),Length(x)+1);
  600.       END ELSE
  601.       BEGIN
  602.         New(PNode);
  603.         PNode^.name    := GetString(egad[1]);
  604.         PNode^.vorname := GetString(egad[2]);
  605.         PNode^.strasse := GetString(egad[3]);
  606.         PNode^.plz     := GetString(egad[4]);
  607.         PNode^.ort     := GetString(egad[5]);
  608.         PNode^.tel     := GetString(egad[6]);
  609.         PNode^.fax     := GetString(egad[7]);
  610.         PNode^.geb     := GetString(egad[8]);
  611.         PNode^.EMail1  := GetString(egad[9]);
  612.         PNode^.EMail2  := GetString(egad[10]);
  613.         PNode^.anrede  := anrede_z;
  614.         PNode^.kommentar := GetString(egad[11]);
  615.         IF anrede_z = 3 THEN PNode^.anrede_s := anrede_s ELSE PNode^.anrede_s := "";
  616.         PNode^.pn.ln_succ := NIL;
  617.         PNode^.pn.ln_pred := NIL;
  618.         PNode^.pn.ln_Type := NT_UNKNOWN;
  619.         PNode^.pn.ln_Pri := 0;
  620.         FOR i := 1 TO 10 DO PNode^.select[i] := ( (egad[i+13]^.Flags AND SELECTED)=SELECTED );
  621.         b := GetString(egad[1])+", "+GetString(egad[2]);
  622.         x := b;
  623.         NeuePerson(PNode,x);
  624.         Inc(Anzahl);
  625.       END;
  626.       IF vonmain THEN 
  627.      BEGIN
  628.       ComputeFont(MainWinWidth,MainWinHeight);
  629.      END
  630.     ELSE
  631.      BEGIN
  632.       ComputeFont(325,140)
  633.      END;
  634.       t[1] := TagItem(GTLV_Labels,LONG(PList));
  635.       t[2] := TagItem(GTLV_Selected, AktuellGewählt);
  636.       t[3].ti_Tag := TAG_DONE;
  637.       GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
  638.       GhostGadget(mgad[M_SUCHEN],wp,FALSE);
  639.       GhostGadget(mgad[M_SORTIEREN],wp,FALSE);
  640.       GhostGadget(mgad[M_ÄNDERN],wp,FALSE);
  641.       GhostGadget(mgad[M_BLÄTTERN],wp,FALSE);
  642.       GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);
  643.       GhostGadget(mgad[M_SERIENDRUCK],wp,FALSE);
  644.       GhostGadget(mgad[M_FORMULARDRUCK],wp,FALSE);
  645.       GhostGadget(mgad[M_LISTENDRUCK],wp,FALSE);
  646.       GT_RefreshWindow(wp,NIL);
  647.       IF Anzahl = 1 THEN AktuellePerson := SucheNode(0);
  648.     END;
  649.     EditWinLeft := wp1^.LeftEdge;
  650.     EditWinTop := wp1^.TopEdge;
  651.     CloseWindow(wp1);
  652.     wp1 := NIL;
  653.     FreeGadgets(gl1);
  654.     gl1 := NIL;
  655.     ComputeFont(MainWinWidth,MainWinHeight);
  656.   END;
  657.  {***!!***} dummy:=FALSE; 
  658. END;
  659.  
  660.  
  661. { ** Löscht einen Datensatz, mit Sicherheitsabfrage
  662.   **
  663.   ** 24.10.1995:
  664.   **
  665.   **  - Kleines "MakeUp" am Sicherheitsrequester
  666.   **  - "Handgemachtes" EasyRequestArgs() durch
  667.   **    MeldReq() ersetzt.
  668.   ** }
  669. PROCEDURE DatensatzLöschen;
  670. VAR letzter:BOOLEAN;
  671. BEGIN
  672.   IF AktuellePerson <> NIL THEN
  673.   BEGIN
  674.     s := "Wollen Sie den Datensatz"+CHR(10)+"'"+
  675.          AktuellePerson^.pn.ln_Name+"'"+CHR(10)+
  676.          "wirklich löschen ????";
  677.     l := MeldReq("!!! ACHTUNG !!!",s,"JA|NEIN!");
  678.     IF l = 1 THEN { OK angeklickt }
  679.     BEGIN
  680.      letzter:=FALSE;
  681.      IF aktuelleperson = p_person(plist^.lh_tailpred) THEN letzter:=TRUE;
  682.      LöscheNode(AktuellePerson);
  683.      Dec(Anzahl);
  684.      IF (Anzahl = 0) THEN
  685.         AktuellePerson := NIL
  686.       ELSE
  687.        IF letzter THEN aktuelleperson:=  p_person(plist^.lh_tailpred)
  688.                   ELSE AktuellePerson := SucheNode(AktuellGewählt);
  689.       t[1] := TagItem(GTLV_Labels,LONG(PList));
  690.       t[2].ti_Tag := GTLV_Selected
  691.       IF Anzahl = 0 THEN
  692.         t[2].ti_Data := NOT 0
  693.       ELSE
  694.         t[2].ti_Data := AktuellGewählt;
  695.       t[3].ti_Tag := TAG_DONE;
  696.       GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
  697.       IF Anzahl = 0 THEN
  698.       BEGIN
  699.         { Gadgets deaktivieren: }
  700.         GhostGadget(mgad[M_SUCHEN],wp,TRUE);
  701.         GhostGadget(mgad[M_SORTIEREN],wp,TRUE);
  702.         GhostGadget(mgad[M_ÄNDERN],wp,TRUE);
  703.         GhostGadget(mgad[M_BLÄTTERN],wp,TRUE);
  704.         GhostGadget(mgad[M_LÖSCHEN],wp,TRUE);
  705.         GhostGadget(mgad[M_SERIENDRUCK],wp,TRUE);
  706.         GhostGadget(mgad[M_FORMULARDRUCK],wp,TRUE);
  707.         GhostGadget(mgad[M_LISTENDRUCK],wp,TRUE);
  708.       END;
  709.     END;
  710.   END;
  711. END;
  712.  
  713. { -- Löscht alle Datensätze -- }
  714. PROCEDURE AllesLöschen;
  715. BEGIN
  716.   IF anzahl = 0 THEN EXIT;
  717.   s := "Wollen Sie wirklich alle "+IntStr(anzahl)+CHR(10)+
  718.        "Datensätze löschen ???";
  719.   es := EasyStruct(SizeOf(EasyStruct),0,"!!! ACHTUNG !!!",s,"JA|NEIN!");
  720.   l := EasyRequestArgs(wp,^es,NIl,NIL);
  721.   IF l = 1 THEN
  722.   BEGIN
  723.     s := "Sind Sie ganz sicher ??";
  724.     es := EasyStruct(SizeOf(EasyStruct),0,"??? Wirklich ???",s,"JA|NEIN!");
  725.     l := EasyRequestArgs(wp,^es,NIl,NIL);
  726.     IF l = 1 THEN
  727.     BEGIN
  728.       DeleteAllPersons;
  729.       New(PList);
  730.       NewList(PList);
  731.       t[1] := TagItem(GTLV_Labels,LONG(NIL));
  732.       t[2].ti_Tag := TAG_DONE;
  733.       GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
  734.       Anzahl := 0;
  735.       AktuellGewählt := 0;
  736.       AktuellePerson := NIL;
  737.       GhostGadget(mgad[M_SUCHEN],wp,TRUE);
  738.       GhostGadget(mgad[M_SORTIEREN],wp,TRUE);
  739.       GhostGadget(mgad[M_ÄNDERN],wp,TRUE);
  740.       GhostGadget(mgad[M_BLÄTTERN],wp,TRUE);
  741.       GhostGadget(mgad[M_LÖSCHEN],wp,TRUE);
  742.       GhostGadget(mgad[M_SERIENDRUCK],wp,TRUE);
  743.       GhostGadget(mgad[M_FORMULARDRUCK],wp,TRUE);
  744.       GhostGadget(mgad[M_LISTENDRUCK],wp,TRUE);
  745.     END;
  746.   END;
  747. END;
  748.  
  749. {$incl "blättern.h","suchen.h"}
  750.  
  751. { ** Kreiert die Menüs für das Hauptfenster
  752.   ** von AddiPro.
  753.   **
  754.   ** 24.10.1995:
  755.   **
  756.   **  - Menüpunkt "Iconify" wird gesperrt, falls AddiPro
  757.   **    von der Shell gestartet wurde.
  758.   **}
  759. PROCEDURE MainMenus;
  760. VAR
  761.   dummy : BOOLEAN;
  762. BEGIN
  763.   Mens[ 1] := NewMenu(NM_TITLE,0,"Projekt",NIL,0,0,NIL);
  764.   Mens[ 2] := NewMenu(NM_ITEM ,0,"Laden","L",0,0,NIL);
  765.   Mens[ 3] := NewMenu(NM_ITEM ,0,"Anhängen","N",0,0,NIL);
  766.   Mens[ 4] := NewMenu(NM_ITEM ,0,"Speichern","S",0,0,NIL);
  767.   Mens[ 5] := NewMenu(NM_ITEM ,0,"Speichern als...","A",0,0,NIL);
  768.   Mens[ 6] := NewMenu(NM_ITEM ,0,STR(NM_BARLABEL),NIL,0,0,NIL);
  769.   Mens[ 7] := NewMenu(NM_ITEM ,0,"Über...","?",0,0,NIL);
  770.   Mens[ 8] := NewMenu(NM_ITEM ,0,STR(NM_BARLABEL),NIL,0,0,NIL);
  771.   Mens[ 9] := NewMenu(NM_ITEM ,0,"Iconify","I",0,0,NIL);
  772.   IF NOT FromWB THEN Mens[9].nm_Flags := NM_ITEMDISABLED;
  773.   Mens[10] := NewMenu(NM_ITEM ,0,"Verlassen","Q",0,0,NIL);
  774.   
  775.   Mens[11] := NewMenu(NM_TITLE,0,"Extras",NIL,0,0,NIL);
  776.   Mens[12] := NewMenu(NM_ITEM ,0,"Alle Adressen löschen",NIL,0,0,NIL);
  777.   Mens[13] := NewMenu(NM_ITEM ,0,STR(NM_BARLABEL),NIL,0,0,NIL);
  778.   Mens[14] := NewMenu(NM_ITEM ,0,"Voreinstellungen...","V",0,0,NIL);
  779.   Mens[15].nm_Type := NM_END;
  780.   t[1] := TagItem(GTMN_NewLookMenus, 1);
  781.   t[2].ti_Tag := TAG_DONE;
  782.   
  783.   MyMen := CreateMenusA(^Mens,^t);
  784.   
  785.   IF MyMen = NIL THEN
  786.   BEGIN
  787.     FreeGadgets(gl);
  788.     CloseWindow(wp);
  789.     FreeVisualInfo(vi);
  790.     UMeld("Menü konnte nicht erzeugt werden !!");
  791.     HALT(20);
  792.   END;
  793.   
  794.   dummy := LayoutMenusA(MyMen, vi, ^t);
  795.   
  796.   dummy := SetMenuStrip(wp, MyMen);
  797. END;
  798.  
  799. { -- Die Hauptprozedur -- }
  800. PROCEDURE Main;
  801. VAR
  802.   ww,wh,
  803.   oldclicked        : INTEGER;
  804.   winmask,
  805.   mask,secs,mics    : LONG;
  806.   msg               : p_IntuiMessage;
  807.   MenNum, ItNum,
  808.   code              : INTEGER;
  809.   amsg              : p_AppMessage;
  810.   wba               : p_WBArg;
  811.   mylock            : BPTR;
  812.  
  813.  PROCEDURE mainwinopen;
  814.    BEGIN
  815.  {***}  IF NOT OS39 THEN mainwinheight:=mainwinheight+12;
  816.    ComputeFont(MainWinWidth,MainWinHeight);
  817.    ww := ComputeX(MainWinWidth);
  818.    wh := ComputeY(MainWinHeight);
  819.   { IF NOT iconified THEN} SetMainGads;
  820.    t[1] := TagItem(WA_InnerWidth,ww);
  821.    t[2] := TagItem(WA_InnerHeight,wh);
  822.    t[3] := TagItem(WA_IDCMP,MainIDCMP);
  823.    t[4] := TagItem(WA_Flags, WFLG_ACTIVATE+
  824.                              WFLG_CLOSEGADGET+
  825.                              WFLG_DRAGBAR+
  826.                              WFLG_DEPTHGADGET+
  827.                              WFLG_HASZOOM+
  828.                              WFLG_NEWLOOKMENUS);
  829.    t[5] := TagItem(WA_Gadgets, LONG(gl));
  830.    t[6] := TagItem(WA_MaxWidth, psw);
  831.    t[7] := TagItem(WA_MaxHeight, psh);
  832.    t[8] := TagItem(WA_MinWidth, 200);
  833.    t[9] := TagItem(WA_MinHeight, yoff);
  834.    t[10].ti_Tag := WA_Title;
  835.    t[10].ti_Data := "AddiPro V0.90ß - Hauptfenster - ";
  836.    t[11].ti_Tag := TAG_DONE;
  837.    IF pubname <> "" THEN
  838.    BEGIN
  839.      t[11] := TagItem(WA_PubScreenFallBack, 1);
  840.      t[12] := TagItem(WA_PubScreenName, LONG(pubname));
  841.      t[13].ti_Tag := TAG_DONE;
  842.    END;
  843.    wp := OpenWindowTagList(NIL,^t);
  844.    IF wp = NIL THEN
  845.    BEGIN
  846.      FreeGadgets(gl);
  847.      FreeVisualInfo(vi);
  848.      UMeld("Konnte kein Fenster öffnen !!");
  849.      HALT(20);
  850.    END;
  851.    AppWin := AddAppWindowA(1,0,wp,AppPort,NIL);
  852.    IF AppWin = NIL THEN
  853.    BEGIN
  854.      CloseWindow(wp);
  855.      FreeGadgets(gl);
  856.      FreeVisualInfo(vi);
  857.      UMeld("Konnte kein AppFenster kreieren !!");
  858.      HALT(20);
  859.    END;
  860.    MainMenus;
  861.   END;
  862.  
  863. { ** Iconify-Routine
  864.   **
  865.   ** vorgeschrieben von Michael Klein, korrigiert
  866.   ** und gepflegt von Björn Schotte
  867.   **}
  868. PROCEDURE IconifyMe;
  869. VAR
  870.   { ** Korrigiert 24.10.1995: War vorher vom Typ
  871.     ** p_Message, was zu einem Absturz führte
  872.     **} 
  873.   dummymsg : p_AppMessage;
  874. BEGIN
  875.   { ** Korrigiert 24.10.1995 von Björn Schotte
  876.     ** einige Intuition-Calls wurden in der
  877.     ** falschen Reihenfolge aufgerufen
  878.     ** }
  879.   iconified := TRUE;
  880.   eigenname := holeEigenname;
  881.   
  882.   { ** Icon besorgen, falls keins besorgt werden
  883.     ** konnte, wird ein Standard-Icon genommen.
  884.     **}
  885.   dobj      := GetDiskObjectNew(eigenname);
  886.   myappicon := AddAppIconA(0,0,'Addipro',AppPort,NIL,dobj,NIL);
  887.   IF myappicon = NIL THEN
  888.   BEGIN
  889.     { ** AppIcon konnte nicht kreiert werden,
  890.       ** Fehlermeldung ausgeben und normal
  891.       ** weiterarbeiten
  892.       **}
  893.     FreeDiskObject(dobj);
  894.     i := MeldReq("Fehler!","Nicht genug Speicher frei!","OK");
  895.     iconified := FALSE;
  896.     EXIT;
  897.   END;
  898.   { ** Hier richtige Reihenfolge eingefügt
  899.     ** Zuerst Gadget-Liste entfernen, dann
  900.     ** die Menü-Leiste, dann alles weitere
  901.     **}  
  902.   err := RemoveGList(wp,wp^.FirstGadget,-1);
  903.   ClearMenuStrip(wp);
  904.   dummy := RemoveAppWindow(AppWin);
  905.   CloseWindow(wp);
  906.   FreeGadgets(gl); 
  907.   FreeVisualInfo(vi);
  908.   freeps;
  909.   { ** Auf Nachricht vom AppIcon warten... ** }
  910.   REPEAT
  911.     dummymsg := p_AppMessage(WaitPort(AppPort));
  912.     dummymsg := p_AppMessage(GetMsg(AppPort)); 
  913.     ReplyMsg(p_Message(dummymsg));
  914.   UNTIL dummymsg^.am_Numargs=0;
  915.   { ** AppIcon entfernen, Fenster öffnen und normal weiterarbeiten ** }
  916.   dummy:=RemoveAppIcon(myAppIcon);
  917.   FreeDiskObject(dobj);
  918.   dobj:=NIL;                       {uuups!}
  919.   getpubscr;
  920.   mainwinopen;
  921.   GT_RefreshWindow(wp,NIL);
  922.   iconified:=FALSE;
  923.   opentt;
  924. END;
  925.      
  926. BEGIN
  927.   iconified:=FALSE;
  928.   oldclicked := -1;
  929.   mainwinopen;
  930.   IF FROMWB THEN 
  931.    IF getwbargs THEN Dateiladen(FALSE) 
  932.                 ELSE IF autoload THEN DateiLaden(FALSE)
  933.   ELSE IF autoload THEN DateiLaden(FALSE);  { knobel ;-) }
  934.     
  935.   GT_RefreshWindow(wp,NIL);
  936.   done := FALSE;
  937.   druckwin:=FALSE;
  938.   REPEAT
  939.     winmask := LONG(1) SHL LONG(wp^.UserPort^.mp_SigBit);
  940.     AppSig := LONG(1) SHL LONG(AppPort^.mp_SigBit);
  941.     IF druckwin THEN 
  942.      druckmask :=(LONG(1) SHL LONG(serdruck^.userport^.mp_SigBit))
  943.      ELSE druckmask:=LONG(0);
  944.     signalmasc:=(winmask OR Appsig OR druckmask);
  945.     mask := _Wait(signalmasc);
  946.     IF (mask AND AppSig) = AppSig THEN
  947.     BEGIN
  948.       amsg := p_AppMessage(GetMsg(AppPort));
  949.       WHILE amsg <> NIL DO
  950.       BEGIN
  951.         CASE amsg^.am_Type OF
  952.           MTYPE_APPWINDOW:
  953.             BEGIN
  954.               wba := amsg^.am_ArgList;
  955.               mylock := CurrentDir(wba^.wa_Lock);
  956.               datei := wba^.wa_Name;
  957.               dummy := GetCurrentDirName(^pfad,256);
  958.               mylock := CurrentDir(mylock);
  959.               DateiLaden(FALSE);
  960.             END;
  961.         ELSE END;
  962.         ReplyMsg(p_Message(amsg));
  963.         amsg := p_AppMessage(GetMsg(AppPort));
  964.       END;
  965.     END ELSE IF (mask AND winmask) = winmask THEN
  966.     BEGIN
  967.        msg := GT_GetIMsg(wp^.UserPort);
  968.        WHILE msg <> NIL DO
  969.        BEGIN
  970.          class := msg^.Class;
  971.          code := msg^.Code;
  972.          qual := msg^.Qualifier;
  973.          secs := msg^.Seconds;
  974.          mics := msg^.Micros;
  975.          IF class IN [IDCMP_GADGETUP, IDCMP_GADGETDOWN] THEN
  976.          BEGIN
  977.            KlickG := msg^.IAddress;
  978.            GadNum := KlickG^.GadgetID;
  979.            IF DoubleClick(oldsecs,oldmics,secs,mics) THEN DoppelKlick := TRUE
  980.            ELSE
  981.            BEGIN
  982.              oldsecs := secs;
  983.              oldmics := mics;
  984.              DoppelKlick := FALSE;
  985.            END;
  986.          END;
  987.          GT_ReplyIMsg(msg);
  988.          CASE class OF
  989.             IDCMP_CLOSEWINDOW : done := TRUE;
  990.             IDCMP_RAWKEY: 
  991.               CASE code OF
  992.                 54: BEGIN
  993.                       ButSelecter(wp,mgad[M_NEU]);
  994.                       SetBusyWindow(wp,MainReq);
  995.                       DPerson := NIL;
  996.                       Edit(DPerson,FALSE);
  997.                       UnBusyWindow(wp,MainReq);
  998.                     END;
  999.                 42: BEGIN
  1000.                       IF (mgad[M_ÄNDERN]^.Flags AND GADGDISABLED)=0 THEN
  1001.                       BEGIN
  1002.                         ButSelecter(wp,mgad[M_ÄNDERN]);
  1003.                         SetBusyWindow(wp,MainReq);
  1004.                         Edit(AktuellePerson,TRUE);
  1005.                         UnBusyWindow(wp,MainReq);
  1006.                       END;
  1007.                     END;
  1008.                 41: BEGIN
  1009.                       IF (mgad[M_LÖSCHEN]^.Flags AND GADGDISABLED)=0 THEN
  1010.                       BEGIN
  1011.                         ButSelecter(wp,mgad[M_LÖSCHEN]);
  1012.                         DatensatzLöschen;
  1013.                       END;
  1014.                     END;
  1015.                 51: BEGIN
  1016.                       IF (mgad[M_SUCHEN]^.Flags AND GADGDISABLED)=0 THEN
  1017.                       BEGIN
  1018.                         ButSelecter(wp,mgad[M_SUCHEN]);
  1019.                         SetBusyWindow(wp,MainReq);
  1020.                         Suchen;
  1021.                         UnBusyWindow(wp,MainReq);
  1022.                       END;
  1023.                     END;
  1024.                 24: BEGIN
  1025.                       ButSelecter(wp,mgad[M_SORTIEREN]);
  1026. {                      SetBusyWindow(wp,MainReq);}
  1027.                       sortieren;
  1028. {                      UnBusyWindow(wp,Mainreq);}
  1029.                      END;
  1030.                 53: BEGIN
  1031.                        IF (mgad[10]^.Flags AND GADGDISABLED)=0 THEN
  1032.                        BEGIN
  1033.                          ButSelecter(wp,mgad[M_BLÄTTERN]);
  1034.                          SetBusyWindow(wp,MainReq);
  1035.                          Blättern(AktuellePerson);
  1036.                          UnBusyWindow(wp,MainReq);
  1037.                        END;
  1038.                     END;
  1039.                 76: BEGIN
  1040.                       IF (AktuellGewählt-1>=0) AND (Anzahl > 0) THEN
  1041.                       BEGIN
  1042.                         Dec(AktuellGewählt);
  1043.                         t[1] := TagItem(GTLV_Selected,AktuellGewählt);
  1044.                         { GTLV_MakeVisible (erst ab OS3.0 !!) }
  1045.                         t[2] := TagItem(GTLV_MakeVisible,AktuellGewählt);
  1046.                         t[3].ti_Tag := TAG_DONE;
  1047.                         GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
  1048.                         AktuellePerson := SucheNode(AktuellGewählt);
  1049.                         GhostGadget(mgad[M_ÄNDERN],wp,FALSE);       
  1050.                         GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);      
  1051.                       END;
  1052.                     END;
  1053.                 77: BEGIN
  1054.                       IF (AktuellGewählt+1<=Anzahl-1) AND (Anzahl > 0) THEN
  1055.                       BEGIN
  1056.                         Inc(AktuellGewählt);
  1057.                         t[1] := TagItem(GTLV_Selected,AktuellGewählt);
  1058.                         t[2] := TagItem(GTLV_MakeVisible,AktuellGewählt);
  1059.                         t[3].ti_Tag := TAG_DONE;
  1060.                         GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
  1061.                         AktuellePerson := SucheNode(AktuellGewählt);
  1062.                         GhostGadget(mgad[M_ÄNDERN],wp,FALSE);       
  1063.                         GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);      
  1064.                       END;
  1065.                     END;
  1066.         
  1067.                 33: BEGIN
  1068.                       ButSelecter(wp,mgad[M_SERIENDRUCK]);
  1069.                       Setbusywindow(wp,Mainreq);      
  1070.                       unbusywindow(wp,mainreq);
  1071.                       IF serdruck=NIL THEN serienbrief;
  1072.                     END;
  1073.  
  1074.                 35: BEGIN
  1075.                       ButSelecter(wp,mgad[M_FORMULARDRUCK]);
  1076.                       Setbusywindow(wp,Mainreq); 
  1077.                       formularmodus;
  1078.                       unbusywindow(wp,mainreq);
  1079.                     END;
  1080.  
  1081.                 40: BEGIN
  1082.                       ButSelecter(wp,mgad[M_LISTENDRUCK]);
  1083.                       Setbusywindow(wp,Mainreq);      
  1084.                       unbusywindow(wp,mainreq);
  1085.                     END;
  1086.               ELSE 
  1087.               END;
  1088.             IDCMP_MENUPICK:
  1089.               BEGIN
  1090.                 mennum := MENUNUM(code);
  1091.                 itnum  := ITEMNUM(code);
  1092.                 CASE mennum OF
  1093.                   0 : CASE itnum OF
  1094.                         0 : BEGIN
  1095.                               SetBusyWindow(wp, MainReq);
  1096.                               DateiLaden(TRUE);
  1097.                               UnBusyWindow(wp, MainReq);
  1098.                             END;
  1099.                         1 : BEGIN
  1100.                              anhaengen;
  1101.                             END; 
  1102.                         2 : BEGIN
  1103.                               SetBusyWindow(wp, MainReq);
  1104.                               DateiSpeichern(FALSE);
  1105.                               UnBusyWindow(wp, MainReq);
  1106.                             END;
  1107.                         3 : BEGIN
  1108.                               SetBusyWindow(wp, MainReq);
  1109.                               DateiSpeichern(TRUE);
  1110.                               UnBusyWindow(wp, MainReq);
  1111.                             END;
  1112.                         5 : BEGIN
  1113.                               SetBusyWindow(wp, MainReq);
  1114.                               Über;
  1115.                               UnBusyWindow(wp, MainReq);
  1116.                             END;
  1117.                         7 : IconifyMe;       
  1118.                         8 : done := TRUE;
  1119.                       ELSE END; 
  1120.                   1 : CASE itnum OF
  1121.                         0 : BEGIN
  1122.                               SetBusyWindow(wp,MainReq);                         
  1123.                               AllesLöschen;
  1124.                               UnBusyWindow(wp, MainReq);
  1125.                             END;
  1126.                         2 : BEGIN
  1127.                               SetBusyWindow(wp,MainReq);                         
  1128.                               Voreinstellungen;
  1129.                               UnBusyWindow(wp, MainReq);
  1130.                             END;
  1131.                       ELSE END;
  1132.                 ELSE END;
  1133.               END;
  1134.             IDCMP_CHANGEWINDOW: GT_RefreshWindow(wp, NIL);
  1135.             IDCMP_GADGETUP:
  1136.               CASE GadNum OF
  1137.                 M_LV :
  1138.                   BEGIN
  1139.                     AktuellePerson := SucheNode(code);
  1140.                     AktuellGewählt := code;
  1141.                     GhostGadget(mgad[M_ÄNDERN],wp,FALSE);
  1142.                     GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);        
  1143.                     { ** Doppelklick auf einen Eintrag -> Eintrag edieren ** }    
  1144.                     IF (DoppelKlick) AND (AktuellGewählt = oldclicked) THEN
  1145.                     BEGIN
  1146.                       oldclicked := -1;
  1147.                       SetBusyWindow(wp,MainReq);
  1148.                       Edit(AktuellePerson,TRUE);
  1149.                       UnBusyWindow(wp,MainReq);
  1150.                     END ELSE oldclicked := code;
  1151.                   END;
  1152.                   
  1153.                 M_NEU :
  1154.                   BEGIN
  1155.                     vonmain:=TRUE;
  1156.                     SetBusyWindow(wp,MainReq);
  1157.                     DPerson := NIL;
  1158.                     Edit(DPerson,FALSE);
  1159.                     UnBusyWindow(wp,MainReq);
  1160.                   END;
  1161.                   
  1162.                 M_ÄNDERN :
  1163.                   BEGIN
  1164.                     vonmain:=TRUE;
  1165.                     SetBusyWindow(wp,MainReq);
  1166.                     Edit(AktuellePerson,TRUE);
  1167.                     UnBusyWindow(wp,MainReq);
  1168.                   END;
  1169.                   
  1170.                 M_LÖSCHEN:
  1171.                   DatensatzLöschen;
  1172.                   
  1173.                 M_SUCHEN:
  1174.                   BEGIN
  1175.                    SetBusyWindow(wp,MainReq)
  1176.                    Suchen;
  1177.                    UnBusyWindow(wp,Mainreq);
  1178.                   END; 
  1179.       
  1180.                 M_SORTIEREN:
  1181.                   BEGIN
  1182. {                   Setbusywindow(wp,Mainreq);}
  1183.                    sortieren;                   
  1184. {                   UnBusyWindow(wp,Mainreq);}
  1185.                   END; 
  1186.       
  1187.                 M_SERIENDRUCK:
  1188.                   BEGIN
  1189.                    Setbusywindow(wp,Mainreq);      
  1190.                    unbusywindow(wp,mainreq);
  1191.                    IF serdruck=NIL THEN serienbrief;
  1192.                   END;
  1193.  
  1194.                 M_FORMULARDRUCK:
  1195.                   BEGIN
  1196.                    Setbusywindow(wp,Mainreq);
  1197.                    Formularmodus;
  1198.                    unbusywindow(wp,mainreq);
  1199.                   END;
  1200.       
  1201.                 M_LISTENDRUCK:
  1202.                   BEGIN
  1203.                    Setbusywindow(wp,Mainreq);      
  1204.                    unbusywindow(wp,mainreq);
  1205.                   END;
  1206.  
  1207.                 M_BLÄTTERN :
  1208.                   BEGIN
  1209.                     SetBusyWindow(wp,MainReq);
  1210.                     Blättern(AktuellePerson);
  1211.                     UnBusyWindow(wp,MainReq);
  1212.                   END;
  1213.               ELSE END;
  1214.          ELSE END;
  1215.          msg := GT_GetIMsg(wp^.UserPort);
  1216.        END;
  1217.     END
  1218.    ELSE IF druckwin AND ((mask AND druckmask) = druckmask) THEN
  1219.     BEGIN
  1220.      serienbriefmsg;
  1221.     END;
  1222.   UNTIL done;
  1223.   dummy := RemoveAppWindow(AppWin);
  1224. END;
  1225.  
  1226. PROCEDURE InitProgAdrs;
  1227. VAR
  1228.   b : STRING;
  1229.   x : STR;
  1230. BEGIN
  1231.   New(PNode);
  1232.   PNode^.Name := "Schotte";
  1233.   PNode^.Vorname := "Björn";
  1234.   PNode^.Strasse := "Am Burkardstuhl 45";
  1235.   PNode^.Ort := "Himmelstadt";
  1236.   PNode^.Plz := "97267";
  1237.   PNode^.tel := "09364 89849";
  1238.   PNode^.fax := "";
  1239.   PNode^.geb := "30.09.1978";
  1240.   PNode^.EMail1 := "bjoern@bomber.mayn.de";
  1241.   PNode^.EMail2 := "";
  1242.   PNode^.anrede := 1;
  1243.   PNode^.anrede_s := "";
  1244.   PNode^.kommentar := "Programmierer von AddiPro";
  1245.   b := PNode^.name+", "+PNode^.vorname;
  1246.   x := b;
  1247.   NeuePerson(PNode,x);
  1248.   New(PNode);
  1249.   PNode^.Name := "Klein";
  1250.   PNode^.Vorname := "Michael";
  1251.   PNode^.Strasse := "Am Wasserturm 6";
  1252.   PNode^.Ort := "Speyer";
  1253.   PNode^.Plz := "67346";
  1254.   PNode^.tel := "06232 77425";
  1255.   PNode^.fax := "";
  1256.   PNode^.geb := "02.05.1973";
  1257.   PNode^.EMail1 := "ujqc@rz.uni-karlsruhe.de";
  1258.   PNode^.EMail2 := "";
  1259.   PNode^.anrede := 1;
  1260.   PNode^.anrede_s := "";
  1261.   PNode^.kommentar := "Programmierer von AddiPro";
  1262.   b := PNode^.name+", "+PNode^.vorname;
  1263.   x := b;
  1264.   NeuePerson(PNode,x);
  1265.   Anzahl := 2;
  1266.   AktuellePerson := p_Person(PList^.lh_Head);
  1267.   AktuellGewählt := 0;
  1268. END;
  1269.  
  1270. { -- Initialisiert alle Variablen -- }
  1271. PROCEDURE InitVars;
  1272. VAR s:STRING;
  1273. BEGIN
  1274.   IF NOT OS39 THEN
  1275.   BEGIN
  1276.     { Kickstart 2.x-Support für Wartezeiger ! }
  1277.     WaitPointerData:=WaitPointerTyp($0000,$0000,
  1278.                                     $0400,$07C0,$0000,$07C0,$0100,$0380,$0000,$07E0,
  1279.                                     $07C0,$1FF8,$1FF0,$3FEC,$3FF8,$7FDE,$3FF8,$7FBE,
  1280.                                     $7FFC,$FF7F,$7EFC,$FFFF,$7FFC,$FFFF,$3FF8,$7FFE,
  1281.                                     $3FF8,$7FFE,$1FF0,$3FFC,$07C0,$1FF8,$0000,$07E0,
  1282.                                     $0000,$0000);
  1283.     WaitPointer    := AllocVec(72,MEMF_CHIP);
  1284.     IF WaitPointer = NIL THEN CleanUp(ERRNO_MEMORY, 20);
  1285.     CopyMem(^WaitPointerData,WaitPointer,72);
  1286.   END;
  1287.   mainwinheight:={132}146;
  1288.   Anzahl         := 0;
  1289.   tattr          := TextAttr("topaz.font",8,0,0);
  1290.   AktuellePerson := NIL;
  1291.   AktuellGewählt := -1;
  1292.   pfad           := "";
  1293.   datei          := "";
  1294.   DruckerAusgabe := "PRT:";
  1295.   pubname        := "";
  1296.   passwort:='geht leider noch nicht !!!';
  1297.   ff := "";
  1298.   fd := "PRT:";
  1299.   ff1 := "";
  1300.   fd1 := "";
  1301.   ff2 := "";
  1302.   fd2 := "";
  1303.   FOR i := 1 TO 10 DO
  1304.     SelectTexte[i] := "Gruppe "+intstr(i);
  1305.   PList := NIL;
  1306.   New(PList);
  1307.   NewList(PList);
  1308.   InitProgAdrs;
  1309.   oldsecs := 0;
  1310.   oldmics := 0;
  1311.   AppPort := NIL;
  1312.   EditWinLeft := 0;
  1313.   EditWinTop := 0;
  1314.   BlätterWinLeft := 0;
  1315.   BlätterWinTop := 0;
  1316.   EinstellWinLeft := 0;
  1317.   EinstellWinTop := 0;
  1318.   aslf_width:=200;
  1319.   aslf_height:=200;
  1320.   aslf_topedge:=0;
  1321.   aslf_leftedge:=0;
  1322.   editor:='c:ed';
  1323.   textanzeiger:='c:ppmore';   
  1324.   druckwinleft:=50;
  1325.   druckwintop:=100;
  1326.   Seriendruckwinleft:=50;
  1327.   Seriendruckwintop:=0;
  1328.   Formulardruckwinleft:=90;
  1329.   Formulardruckwintop:=0;
  1330.   Listendruckwinleft:=0;
  1331.   Listendruckwintop:=0;
  1332.   suchwinleft:=0;
  1333.   suchwintop:=0;
  1334.   Sortierwinleft:=0;
  1335.   sortierwintop:=0;
  1336.   suchbuf:='';
  1337.   Suchpfadwinleft:=0;
  1338.   suchpfadwintop:=0;
  1339.   selectwinleft:=0;
  1340.   selectwintop:=0;
  1341.   verschluesseln:=FALSE;
  1342.   iconsave:=FALSE;
  1343.   autoload:=FALSE;
  1344.   serdruck:=NIL;
  1345.     { -- Filename der Voreinstellungsdatei (Select-Texte etc.) -- } 
  1346.   prefsfile:="ENVARC:AddiPro.env";
  1347.   IF holett('PREFSFILE',s) THEN prefsfile:=s;
  1348.   eigenname:=holeeigenname;
  1349.   IF holett('ICON',s) THEN iconname:=s;
  1350. END;
  1351.  
  1352. PROCEDURE WBKram;
  1353. VAR  s      : STRING;
  1354.   
  1355. BEGIN
  1356.  IF holett('PFAD',s) THEN pfad:=s;
  1357.  IF holett('PUBSCREEN',s) THEN pubname:=s;
  1358. END;
  1359.  
  1360. PROCEDURE DeleteAnyPort(VAR port:p_MsgPort);
  1361. VAR
  1362.   msg : p_Message;
  1363. BEGIN
  1364.   Forbid;
  1365.   IF Port <> NIL THEN
  1366.   BEGIN
  1367.     msg := GetMsg(Port);
  1368.     WHILE msg <> NIL DO
  1369.     BEGIN
  1370.       ReplyMsg(msg);
  1371.       msg := GetMsg(Port);
  1372.     END;
  1373.     RemPort(Port);
  1374.     DeleteMsgPort(Port);
  1375.   END;
  1376.   Port := NIL;
  1377.   Permit;
  1378. END;
  1379.  
  1380. { -- AppIcon/AppWindow-Port -- }
  1381. PROCEDURE InitAppPort;
  1382. BEGIN
  1383.   AppPort := CreateMsgPort;
  1384.   IF AppPort = NIL THEN
  1385.   BEGIN
  1386.     UMeld("Kann keinen Messageport kreieren !!");
  1387.     HALT(20);
  1388.   END;
  1389.   AppPort^.mp_Node.ln_Name := AppName;
  1390.   AppPort^.mp_Node.ln_Pri  := 0;
  1391.   AppPort^.mp_SigTask      := FindTask(NIL);
  1392.   AddPort(AppPort);
  1393. END;
  1394.  
  1395. PROCEDURE DeleteAppPort;
  1396. BEGIN
  1397.   DeleteAnyPort(AppPort);
  1398. END;
  1399.  
  1400.  
  1401.  
  1402. { -- Kleines Hauptprogramm -- }
  1403. BEGIN
  1404.   Versionsprüfung;
  1405.   OpenLibs;
  1406.   opentt;
  1407.   InitVars;
  1408.   InitAppPort;
  1409.   AddExitServer(DeleteAppPort);
  1410.   WBKram;
  1411.   GetPubScr;
  1412.   LoadPrefs;
  1413.   Main;
  1414.   IF Anzahl > 0 THEN DeleteAllPersons;
  1415.   CleanUp("",0);
  1416. END.
  1417.